Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

core/takserver/src/commonTest/kotlin/org/meshtastic/core/takserver/CoTDetailStripperTest.kt 65a1f5ce4d0e4b8eafcd0bbfccafd41dc6ee888a (65a1f5ce) Text, 11.45 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.takserver

Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertFalse
Tff7b72import T7ee787kotlin.test.assertTrue

T8b949e/**
* Covers the allowed/stripped element contract documented on [CoTDetailStripper]. If a test here starts failing because
* a new element type was added to the strip list, update the strip-list KDoc in [CoTDetailStripper] in the same change.
*/
Tff7b72class T56d364CoTDetailStripperTest Tb4b4b4{

Tf0883e@Test
Tff7b72fun Td2a8ffempty_input_returns_emptyTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3CoTDetailStripperTb4b4b4.Te6edf3stripTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffpreserves_contact_group_status_trackTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3input Tff7b72=
Ta5d6ff"""
Ta5d6ff <contact callsign=Ta5d6ff"Ta5d6ffAliceTa5d6ff"Ta5d6ff/>
<__group name=Ta5d6ff"Ta5d6ffCyanTa5d6ff"Ta5d6ff role=Ta5d6ff"Ta5d6ffTeam MemberTa5d6ff"Ta5d6ff/>
<status battery=Ta5d6ff"Ta5d6ff82Ta5d6ff"Ta5d6ff/>
<track speed=Ta5d6ff"Ta5d6ff5.0Ta5d6ff"Ta5d6ff course=Ta5d6ff"Ta5d6ff180.0Ta5d6ff"Ta5d6ff/>
Ta5d6ff"""
Tb4b4b4.Te6edf3trimIndentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stripped Tff7b72= Te6edf3CoTDetailStripperTb4b4b4.Te6edf3stripTb4b4b4(Te6edf3inputTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<contactTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffcontact must be preservedTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<__groupTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ff__group must be preservedTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<statusTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffstatus must be preservedTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<trackTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6fftrack must be preservedTa5d6ff"Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffstrips_cosmetic_elementsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3input Tff7b72=
Ta5d6ff"""
Ta5d6ff <contact callsign=Ta5d6ff"Ta5d6ffAliceTa5d6ff"Ta5d6ff/>
<color argb=Ta5d6ff"Ta5d6ff-65536Ta5d6ff"Ta5d6ff/>
<strokeColor value=Ta5d6ff"Ta5d6ff#ffffffTa5d6ff"Ta5d6ff/>
<strokeWeight value=Ta5d6ff"Ta5d6ff3Ta5d6ff"Ta5d6ff/>
<fillColor value=Ta5d6ff"Ta5d6ff#000000Ta5d6ff"Ta5d6ff/>
<labels_on value=Ta5d6ff"Ta5d6fffalseTa5d6ff"Ta5d6ff/>
<usericon iconsetpath=Ta5d6ff"Ta5d6ffCOT_MAPPING_2525B/a-u-GTa5d6ff"Ta5d6ff/>
<model path=Ta5d6ff"Ta5d6fffoo.objTa5d6ff"Ta5d6ff/>
Ta5d6ff"""
Tb4b4b4.Te6edf3trimIndentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stripped Tff7b72= Te6edf3CoTDetailStripperTb4b4b4.Te6edf3stripTb4b4b4(Te6edf3inputTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<contactTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffcontact must surviveTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<colorTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffcolor must be strippedTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<strokeColorTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffstrokeColor must be strippedTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<strokeWeightTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffstrokeWeight must be strippedTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<fillColorTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6fffillColor must be strippedTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<labels_onTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6fflabels_on must be strippedTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<usericonTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffusericon must be strippedTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<modelTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffmodel must be strippedTa5d6ff"Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffstrips_geometric_detail_including_nested_contentTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// <shape> is the biggest single bloat contributor for u-d-c-c events — it
T8b949e// contains an <ellipse> and usually a <link> styling child. Make sure the
T8b949e// entire subtree goes, not just the opening tag.
Tff7b72val Te6edf3input Tff7b72=
Ta5d6ff"""
Ta5d6ff <contact callsign=Ta5d6ff"Ta5d6ffAliceTa5d6ff"Ta5d6ff/>
<shape>
<ellipse major=Ta5d6ff"Ta5d6ff500Ta5d6ff"Ta5d6ff minor=Ta5d6ff"Ta5d6ff500Ta5d6ff"Ta5d6ff angle=Ta5d6ff"Ta5d6ff0Ta5d6ff"Ta5d6ff/>
<link line=Ta5d6ff"Ta5d6ff#ff0000Ta5d6ff"Ta5d6ff width=Ta5d6ff"Ta5d6ff3Ta5d6ff"Ta5d6ff/>
</shape>
<height value=Ta5d6ff"Ta5d6ff100Ta5d6ff"Ta5d6ff/>
<height_unit value=Ta5d6ff"Ta5d6ffmTa5d6ff"Ta5d6ff/>
Ta5d6ff"""
Tb4b4b4.Te6edf3trimIndentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stripped Tff7b72= Te6edf3CoTDetailStripperTb4b4b4.Te6edf3stripTb4b4b4(Te6edf3inputTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<contactTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffcontact must surviveTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffshapeTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffshape subtree must be stripped: Tffd700$Te6edf3strippedTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffellipseTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffellipse must be stripped with its parentTa5d6ff"Tb4b4b4)
T8b949e// Note: <link> inside <shape> is also gone because we strip the whole subtree.
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<heightTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffheight must be strippedTa5d6ff"Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffstrips_resource_references_and_flagsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3input Tff7b72=
Ta5d6ff"""
Ta5d6ff <contact callsign=Ta5d6ff"Ta5d6ffAliceTa5d6ff"Ta5d6ff/>
<archive/>
<precisionlocation altsrc=Ta5d6ff"Ta5d6ffGPSTa5d6ff"Ta5d6ff geopointsrc=Ta5d6ff"Ta5d6ffGPSTa5d6ff"Ta5d6ff/>
<fileshare filename=Ta5d6ff"Ta5d6fffoo.zipTa5d6ff"Ta5d6ff senderUrl=Ta5d6ff"Ta5d6ffhttp://example.com/foo.zipTa5d6ff"Ta5d6ff/>
<__video url=Ta5d6ff"Ta5d6ffrtsp://example.com/streamTa5d6ff"Ta5d6ff/>
Ta5d6ff"""
Tb4b4b4.Te6edf3trimIndentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stripped Tff7b72= Te6edf3CoTDetailStripperTb4b4b4.Te6edf3stripTb4b4b4(Te6edf3inputTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<contactTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffcontact must surviveTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<archiveTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffarchive must be strippedTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<precisionlocationTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffprecisionlocation must be strippedTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<fileshareTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6fffileshare must be strippedTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<__videoTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ff__video must be strippedTa5d6ff"Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffpreserves_chat_related_elementsTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// These are all critical for GeoChat round-tripping and must survive stripping.
Tff7b72val Te6edf3input Tff7b72=
Ta5d6ff"""
Ta5d6ff <__chat parent=Ta5d6ff"Ta5d6ffRootContactGroupTa5d6ff"Ta5d6ff groupOwner=Ta5d6ff"Ta5d6fffalseTa5d6ff"Ta5d6ff messageId=Ta5d6ff"Ta5d6ffabcTa5d6ff"Ta5d6ff chatroom=Ta5d6ff"Ta5d6ffAll Chat RoomsTa5d6ff"Ta5d6ff id=Ta5d6ff"Ta5d6ffAll Chat RoomsTa5d6ff"Ta5d6ff senderCallsign=Ta5d6ff"Ta5d6ffAliceTa5d6ff"Ta5d6ff>
<chatgrp uid0=Ta5d6ff"Ta5d6ffabc-123Ta5d6ff"Ta5d6ff uid1=Ta5d6ff"Ta5d6ffAll Chat RoomsTa5d6ff"Ta5d6ff id=Ta5d6ff"Ta5d6ffAll Chat RoomsTa5d6ff"Ta5d6ff/>
</__chat>
<link uid=Ta5d6ff"Ta5d6ffabc-123Ta5d6ff"Ta5d6ff type=Ta5d6ff"Ta5d6ffa-f-G-U-CTa5d6ff"Ta5d6ff relation=Ta5d6ff"Ta5d6ffp-pTa5d6ff"Ta5d6ff/>
<__serverdestination destinations=Ta5d6ff"Ta5d6ff0.0.0.0:4242:tcp:abc-123Ta5d6ff"Ta5d6ff/>
<remarks source=Ta5d6ff"Ta5d6ffBAO.F.ATAK.abc-123Ta5d6ff"Ta5d6ff to=Ta5d6ff"Ta5d6ffAll Chat RoomsTa5d6ff"Ta5d6ff time=Ta5d6ff"Ta5d6ff2025-01-01T12:00:00.000ZTa5d6ff"Ta5d6ff>hello world</remarks>
Ta5d6ff"""
Tb4b4b4.Te6edf3trimIndentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stripped Tff7b72= Te6edf3CoTDetailStripperTb4b4b4.Te6edf3stripTb4b4b4(Te6edf3inputTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<__chatTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ff__chat must survive strippingTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<chatgrpTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffchatgrp must survive strippingTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<linkTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6fflink must survive strippingTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<__serverdestinationTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ff__serverdestination must surviveTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<remarksTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffremarks must surviveTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffhello worldTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffremarks text content must surviveTa5d6ff"Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffcollapses_inter_element_whitespaceTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3input Tff7b72=
Ta5d6ff"""
Ta5d6ff <contact callsign=Ta5d6ff"Ta5d6ffAliceTa5d6ff"Ta5d6ff/>
<status battery=Ta5d6ff"Ta5d6ff82Ta5d6ff"Ta5d6ff/>
Ta5d6ff"""
Tb4b4b4.Te6edf3trimIndentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stripped Tff7b72= Te6edf3CoTDetailStripperTb4b4b4.Te6edf3stripTb4b4b4(Te6edf3inputTb4b4b4)
T8b949e// No leading/trailing whitespace.
Te6edf3assertEqualsTb4b4b4(Te6edf3strippedTb4b4b4, Te6edf3strippedTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4)
T8b949e// No line breaks / indentation between elements.
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff\Ta5d6ffnTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffoutput must not contain newlines: Tffd700$Te6edf3strippedTa5d6ff"Tb4b4b4)
T8b949e// Elements should be directly concatenated.
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff/><Ta5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffadjacent elements must be directly concatenated: Tffd700$Te6edf3strippedTa5d6ff"Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffhandles_interleaved_strip_and_keep_elementsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3input Tff7b72=
Ta5d6ff"""
Ta5d6ff <contact callsign=Ta5d6ff"Ta5d6ffAliceTa5d6ff"Ta5d6ff/>
<color argb=Ta5d6ff"Ta5d6ff-65536Ta5d6ff"Ta5d6ff/>
<__group name=Ta5d6ff"Ta5d6ffCyanTa5d6ff"Ta5d6ff role=Ta5d6ff"Ta5d6ffTeam MemberTa5d6ff"Ta5d6ff/>
<shape><ellipse major=Ta5d6ff"Ta5d6ff500Ta5d6ff"Ta5d6ff minor=Ta5d6ff"Ta5d6ff500Ta5d6ff"Ta5d6ff angle=Ta5d6ff"Ta5d6ff0Ta5d6ff"Ta5d6ff/></shape>
<status battery=Ta5d6ff"Ta5d6ff82Ta5d6ff"Ta5d6ff/>
<labels_on value=Ta5d6ff"Ta5d6fffalseTa5d6ff"Ta5d6ff/>
<track speed=Ta5d6ff"Ta5d6ff5.0Ta5d6ff"Ta5d6ff course=Ta5d6ff"Ta5d6ff180.0Ta5d6ff"Ta5d6ff/>
Ta5d6ff"""
Tb4b4b4.Te6edf3trimIndentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stripped Tff7b72= Te6edf3CoTDetailStripperTb4b4b4.Te6edf3stripTb4b4b4(Te6edf3inputTb4b4b4)
T8b949e// All four keep-elements survive in order.
Tff7b72val Te6edf3contactIdx Tff7b72= Te6edf3strippedTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff"Ta5d6ff<contactTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3groupIdx Tff7b72= Te6edf3strippedTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff"Ta5d6ff<__groupTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3statusIdx Tff7b72= Te6edf3strippedTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff"Ta5d6ff<statusTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3trackIdx Tff7b72= Te6edf3strippedTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff"Ta5d6ff<trackTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3contactIdx Tff7b72>Tff7b72= T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ffcontact missingTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3groupIdx Tff7b72>Tff7b72= T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ffgroup missingTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3statusIdx Tff7b72>Tff7b72= T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ffstatus missingTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3trackIdx Tff7b72>Tff7b72= T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6fftrack missingTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3contactIdx Tff7b72< Te6edf3groupIdxTb4b4b4, Ta5d6ff"Ta5d6ffcontact must come before groupTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3groupIdx Tff7b72< Te6edf3statusIdxTb4b4b4, Ta5d6ff"Ta5d6ffgroup must come before statusTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3statusIdx Tff7b72< Te6edf3trackIdxTb4b4b4, Ta5d6ff"Ta5d6ffstatus must come before trackTa5d6ff"Tb4b4b4)
T8b949e// None of the stripped elements linger.
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffcolorTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffcolor strippedTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffshapeTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffshape strippedTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffellipseTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffellipse strippedTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6fflabels_onTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6fflabels_on strippedTa5d6ff"Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffstrips_tog_and_flow_tagsTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// <tog> is the rectangle "toggle" flag ATAK emits; <_flow-tags_> is TAK
T8b949e// Server routing metadata. Both are pure bloat over the mesh. These are
T8b949e// specifically tested because their names contain regex-special characters
T8b949e// (`-`, `_`) and it's easy to typo the strip-list pattern.
Tff7b72val Te6edf3input Tff7b72=
Ta5d6ff"""
Ta5d6ff <contact callsign=Ta5d6ff"Ta5d6ffAliceTa5d6ff"Ta5d6ff/>
<tog enabled=Ta5d6ff"Ta5d6ff0Ta5d6ff"Ta5d6ff/>
<_flow-tags_ marti1=Ta5d6ff"Ta5d6ff2014-10-28T22:40:15.341ZTa5d6ff"Ta5d6ff/>
Ta5d6ff"""
Tb4b4b4.Te6edf3trimIndentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stripped Tff7b72= Te6edf3CoTDetailStripperTb4b4b4.Te6edf3stripTb4b4b4(Te6edf3inputTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<contactTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffcontact must surviveTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<togTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6fftog must be stripped: Tffd700$Te6edf3strippedTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff_flow-tags_Ta5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ff_flow-tags_ must be stripped: Tffd700$Te6edf3strippedTa5d6ff"Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffreal_world_u_d_c_c_event_shrinks_dramaticallyTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// Synthetic reproduction of what ATAK actually emits for a drawn circle —
T8b949e// this is the 800-byte payload the user's logs were choking on.
Tff7b72val Te6edf3realistic Tff7b72=
Ta5d6ff"""Ta5d6ff<contact callsign='ALPHA01'/><__group name='Cyan' role='Team Member'/>Ta5d6ff""" Tff7b72+
Ta5d6ff"""Ta5d6ff<status battery='85'/><precisionlocation altsrc='GPS' geopointsrc='GPS'/>Ta5d6ff""" Tff7b72+
Ta5d6ff"""Ta5d6ff<shape><ellipse major='500' minor='500' angle='0'/><link line='#ff0000' width='3'/></shape>Ta5d6ff""" Tff7b72+
Ta5d6ff"""Ta5d6ff<color argb='-65536'/><labels_on value='false'/><archive/>Ta5d6ff""" Tff7b72+
Ta5d6ff"""Ta5d6ff<usericon iconsetpath='COT_MAPPING_2525B/a-u-G/a-u-G-U-C-I-M/a-u-G-U-C-I-M-N-S'/>Ta5d6ff""" Tff7b72+
Ta5d6ff"""Ta5d6ff<strokeColor value='-65536'/><strokeWeight value='3'/><fillColor value='1157562368'/>Ta5d6ff""" Tff7b72+
Ta5d6ff"""Ta5d6ff<height value='100'/><height_unit value='m'/>Ta5d6ff""" Tff7b72+
Ta5d6ff"""Ta5d6ff<fileshare filename='overlay.kml' senderUrl='http://10.0.0.1/overlay.kml' Ta5d6ff""" Tff7b72+
Ta5d6ff"""Ta5d6ffsizeInBytes='2048' sha256='deadbeef'/>Ta5d6ff""" Tff7b72+
Ta5d6ff"""Ta5d6ff<__video url='rtsp://10.0.0.1:8554/stream'/>Ta5d6ff"""
Tff7b72val Te6edf3stripped Tff7b72= Te6edf3CoTDetailStripperTb4b4b4.Te6edf3stripTb4b4b4(Te6edf3realisticTb4b4b4)
Tff7b72val Te6edf3before Tff7b72= Te6edf3realisticTb4b4b4.Te6edf3length
Tff7b72val Te6edf3after Tff7b72= Te6edf3strippedTb4b4b4.Te6edf3length
T8b949e// Should shrink by at least 60% — most of the bytes were bloat.
Te6edf3assertTrueTb4b4b4(Te6edf3after Tff7b72< Te6edf3before Tff7b72* T79c0ff0.4Tb4b4b4, Ta5d6ff"Ta5d6ffexpected >60% reduction; before=Tffd700$Te6edf3beforeTa5d6ff after=Tffd700$Te6edf3afterTa5d6ff stripped='Tffd700$Te6edf3strippedTa5d6ff'Ta5d6ff"Tb4b4b4)
T8b949e// Only the three "essential" elements survive.
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<contactTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffcontact must surviveTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<__groupTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ff__group must surviveTa5d6ff"Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff<statusTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffstatus must surviveTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffshapeTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffshape must be goneTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6fffileshareTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6fffileshare must be goneTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.07s